package cn.zxcoder.controller.Statistics;


import cn.zxcoder.Tools.ToolUtil;
import cn.zxcoder.config.MonthTableNameHandler;
import cn.zxcoder.entity.Res;
import cn.zxcoder.entity.Statistics.Count;
import cn.zxcoder.entity.Statistics.ModeData;
import cn.zxcoder.entity.Statistics.ModeData2;
import cn.zxcoder.entity.Statistics.StatisticsRes;
import cn.zxcoder.entity.SystemManage.Dept;
import cn.zxcoder.entity.goods.Log;
import cn.zxcoder.entity.goods.Product;
import cn.zxcoder.entity.goods.Repertory;
import cn.zxcoder.entity.login.Behavior;
import cn.zxcoder.entity.pay.CnfInfo;
import cn.zxcoder.entity.pay.Order;
import cn.zxcoder.entity.pay.Stat;
import cn.zxcoder.service.*;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;


@RestController
@RequestMapping("/api/Statistics")
public class StatisticsController {


    @Autowired
    IOrderService iOrderServiceIml;

    @Autowired
    IModeService iModeServiceIml;

    @Autowired
    ICnfInfoService iCnfInfoServiceIml;

    @Autowired
    IDeptService iDeptServiceIml;

    @Autowired
    ICountNumService iCountNumServiceIml;

    @Autowired
    IProductService iProductServiceIml;

    @Autowired
    ILogService iLogServiceImpl;

    @Autowired
    IBehaviorService iBehaviorServiceImpl;

    @ApiOperation("可视化的数据")
    @PostMapping("/list")
    @Transactional(readOnly = true)
    public Res getResData(@RequestParam String dept, @RequestParam String mode, @RequestParam String type) {


        //查询现在的月份和天数
        int month = Calendar.getInstance().get(Calendar.MONTH) + 1;
        int day = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);


        StatisticsRes statisticsRes = new StatisticsRes();

        QueryWrapper<Order> wrapper = ToolUtil.getWrapper(dept, mode, iCnfInfoServiceIml,type,day,month,false);
        wrapper.select("month(addTime) as month,count(*) as count");
        wrapper.groupBy("month(addTime)");
        //查出订单数据的总笔数
        List<Map<String, Object>> list = iOrderServiceIml.listMaps(wrapper);//获取了相应条件下的所有订单数据
        int[] temp = new int[12];
        int num = 0;
        for (Map<String, Object> stringObjectMap : list) {
            long count = (long) stringObjectMap.get("count");
            temp[(int) stringObjectMap.get("month")-1] = (int)count;
            if (count == 0) {
                num++;
            }
        }
        if (num == 12) {
            return new Res(false, null, "还没有订单呢");
        }
        ArrayList<Integer> SCEoption = new ArrayList<>();
        Arrays.stream(temp).forEach(SCEoption::add);
        statisticsRes.setSCEoption(SCEoption);//设置总笔数

        //查订单数据的总金额
        ArrayList<String> SUMoption = new ArrayList<>();
        for (int i = 0; i < temp.length; i++) {
            if (temp[i] == 0) {
                SUMoption.add("0");
            } else {
                QueryWrapper<Order> wrapper1 = ToolUtil.getWrapper(dept, mode, iCnfInfoServiceIml,type,day,month,false);
                wrapper1.eq("month(addTime)", i + 1);
                List<Order> list1 = iOrderServiceIml.list(wrapper1);
                BigDecimal res = new BigDecimal("0");
                for (Order order : list1) {
                    String dealMode = order.getDealMode();
                    Integer productId = order.getProductId();
                    Product product = iProductServiceIml.getById(productId);
                    String goodsPrice = product.getGoodsPrice();
                    res = dealMode.equals("消费") ? res.add(new BigDecimal(goodsPrice)) : res.subtract(new BigDecimal("-" + goodsPrice));
                }
                SUMoption.add(res.setScale(2, BigDecimal.ROUND_HALF_UP).toString());
            }
        }
        statisticsRes.setSUMoption(SUMoption);//设置总金额


        //查询点击数
        List<Count> list1 = iCountNumServiceIml.list();
        List<Integer> Clickoption = new ArrayList<>();
        int[] temp1 = new int[12];
        for (Count count : list1) {
            temp1[count.getaddMonth()] = count.getCount();
        }
        Arrays.stream(temp1).forEach(Clickoption::add);
        statisticsRes.setClickoption(Clickoption);//设置点击数


        //查出出库排名前五名
        QueryWrapper<Log> repertoryQueryWrapper = new QueryWrapper<>();
        repertoryQueryWrapper.eq("operation", "出库操作");
        repertoryQueryWrapper.select("name,count(*) as value");
        repertoryQueryWrapper.groupBy("name");
        repertoryQueryWrapper.orderBy(true, false, "value");
        MonthTableNameHandler.setData(String.valueOf(month));
        List<Map<String, Object>> maps = iLogServiceImpl.listMaps(repertoryQueryWrapper);

//        List<Map<String, Integer>> maps = new ArrayList<>();
//        _maps.forEach(i->{
//            HashMap<String, Integer> map = new HashMap<>();
//            map.put("name",i.get("name"));
//        });
//
//        maps.sort(new Comparator<Map<String, Object>>() {
//            @Override
//            public int compare(Map<String, Object> o1, Map<String, Object> o2) {
//               return  o1.get("value") - o2.get("value");
//            }
//        });


        List<Map<String, Object>> collect = maps.stream().limit(5).collect(Collectors.toList());
        statisticsRes.setOut(collect);

        //查出用户操作排名前五名
        QueryWrapper<Behavior> QueryWrapper = new QueryWrapper<>();
        QueryWrapper.select("user_name as name,count(*) as value");
        QueryWrapper.groupBy("user_name");
        repertoryQueryWrapper.orderBy(true, false, "value");

        List<Map<String, Object>> maps1 = iBehaviorServiceImpl.listMaps(QueryWrapper);
//        List<Map<String, Integer>> maps1 = new ArrayList<>();

//        maps1.sort(new Comparator<Map<String, Object>>() {
//            @Override
//            public int compare(Map<String, Object> o1, Map<String, Object> o2) {
//                return (Integer) o1.get("value") - (Integer) o2.get("value");
//            }
//        });
//        for (Map<String, Object> map : _maps1) {
//            HashMap<String, Integer> hashMap = new HashMap<>();
//            Set<String> strings = map.keySet();
//            for (String string : strings) {
//                Integer o = (Integer)map.get(string);
//                hashMap.put(string, o);
//            }
//            maps1.add(hashMap);
//        }
//        maps1.sort((o1, o2) -> {
//            int v1 = 0;
//            int v2 = 0;
//            for (String s : o1.keySet()) {
//                v1 = o1.get(s);
//            }
//            for (String s : o2.keySet()) {
//                v2 = o1.get(s);
//            }
//            return v1 - v2;
//        });
        List<Map<String, Object>> collect1 = maps1.stream().limit(5).collect(Collectors.toList());
        statisticsRes.setUserop(collect1);


//        Integer cnfinfoId = 0;
//        //先查询销售数据和点击量
//        QueryWrapper<Order> wrapper1 = new QueryWrapper<>();
//        if (!dept.equals("")) {
//            wrapper1.eq("dept_id", Integer.parseInt(dept));
//        }
//        if (!mode.equals("")) {
//            QueryWrapper<CnfInfo> cnfInfoQueryWrapper = new QueryWrapper<>();
//            cnfInfoQueryWrapper.eq("mode", mode);
//            cnfinfoId = iCnfInfoServiceIml.getOne(cnfInfoQueryWrapper).getId();
//            wrapper1.eq("cnfinfo_id", cnfinfoId);
//        }
//        wrapper1.select(Order.class, info -> !info.getColumn().equals("mode") && !info.getColumn().equals("status") &&
//                !info.getColumn().equals("editTime") && !info.getColumn().equals("editUser") && !info.getColumn().equals("tnumber") &&
//                !info.getColumn().equals("configId") && !info.getColumn().equals("name") && !info.getColumn().equals("subName"));
//
//        if (type.equals("day")) {
//            wrapper1.eq("day(addTime)", day);
//        } else if (type.equals("month")) {
//            wrapper1.eq("month(addTime)", month);
//        }//条件器构造结束
//
//        //查询支付方式统计(金额)
//        ArrayList<ModeData2> payoption = new ArrayList<>();
//        QueryWrapper<CnfInfo> cnfInfoQueryWrapper = new QueryWrapper<>();
//        cnfInfoQueryWrapper.select(CnfInfo.class, info -> !info.getColumn().equals("name") && !info.getColumn().equals("subName"));
//        List<CnfInfo> list2 = iCnfInfoServiceIml.list(cnfInfoQueryWrapper);
//        List<Integer> cnfInfoIds = list2.stream().map(CnfInfo::getId).collect(Collectors.toList());
//
//        if (!mode.equals("")) {//当确定了一种支付方式了
//            String modeName = iModeServiceIml.getById(iCnfInfoServiceIml.getById(cnfinfoId).getMode()).getName();
//            wrapper1.eq("cnfinfo_id", cnfinfoId);
//            List<Order> list3 = iOrderServiceIml.list(wrapper1);//查询出了此mode方式下的所有订单集合
//            ModeData2 modeData = new ModeData2();
//            modeData.setName(modeName);
//            BigDecimal res = new BigDecimal("0");
//            if (list3.size() == 0) {
//                modeData.setValue(0d);
//                payoption.add(modeData);
//            } else {
//                for (Order order : list3) {
//                    String dealMode = order.getDealMode();//退款还是消费
//                    String goodsPrice = iProductServiceIml.getById(order.getProductId()).getGoodsPrice();
//                    res = dealMode.equals("消费") ? res.add(new BigDecimal(goodsPrice)) : res.subtract(new BigDecimal(goodsPrice));
//                }
//                modeData.setValue(Double.valueOf(res.setScale(2, BigDecimal.ROUND_HALF_UP).toString()));
//                payoption.add(modeData);
//            }
//            for (Integer cnfInfoId : cnfInfoIds) {
//                String modeName1 = iModeServiceIml.getById(iCnfInfoServiceIml.getById(cnfInfoId).getMode()).getName();
//                if (!cnfInfoId.equals(cnfinfoId)) {
//                    ModeData2 modeData1 = new ModeData2();
//                    modeData1.setName(modeName1);
//                    modeData1.setValue(0d);
//                    payoption.add(modeData1);
//                }
//            }
//            statisticsRes.setPayoption(payoption);//设置好支付方式统计-金额
//        }
//        else {//并没有确定一种支付方式
//            for (Integer cnfInfoId : cnfInfoIds) {
//                QueryWrapper<Order> wrapper2 = ToolUtil.getWrapper(dept, mode, iCnfInfoServiceIml,type,day,month,true);
//                String modeName = iModeServiceIml.getById(iCnfInfoServiceIml.getById(cnfInfoId).getMode()).getName();
//                wrapper2.eq("cnfinfo_id", cnfInfoId);
//                BigDecimal res = new BigDecimal("0");
//                ModeData2 modeData = new ModeData2();
//                modeData.setName(modeName);
//
//                List<Order> list3 = iOrderServiceIml.list(wrapper2);//查询出了此mode方式下的所有订单集合
//                if (list3.size()==0) {
//                    modeData.setValue(0d);
//                    payoption.add(modeData);
//                    continue;
//                }
//                for (Order order : list3) {
//                    String dealMode = order.getDealMode();//退款还是消费
//                    String goodsPrice = iProductServiceIml.getById(order.getProductId()).getGoodsPrice();
//                    res = dealMode.equals("消费") ? res.add(new BigDecimal(goodsPrice)) : res.subtract(new BigDecimal(goodsPrice));
//                }
//                modeData.setValue(Double.valueOf(res.setScale(2, BigDecimal.ROUND_HALF_UP).toString()));
//                payoption.add(modeData);
//            }
//            statisticsRes.setPayoption(payoption);//设置好支付方式统计-金额
//        }
//
//        //查询支付方式统计(笔数)
//        List<ModeData> payNumoption = new ArrayList<>();
//        QueryWrapper<Order> wrapper2 = ToolUtil.getWrapper(dept, mode, iCnfInfoServiceIml,type,day,month,true);
//        if (!mode.equals("")) {
//            String modeName = iModeServiceIml.getById(iCnfInfoServiceIml.getById(cnfinfoId).getMode()).getName();
//            int size = iOrderServiceIml.list(wrapper2).size();
//            ModeData modeData = new ModeData();
//            modeData.setValue(size);
//            modeData.setName(modeName);
//            payNumoption.add(modeData);
//            for (Integer cnfInfoId : cnfInfoIds) {
//                if (!cnfInfoId.equals(cnfinfoId)) {
//                    String modeName1 = iModeServiceIml.getById(iCnfInfoServiceIml.getById(cnfInfoId).getMode()).getName();
//                    ModeData modeData2 = new ModeData();
//                    modeData2.setName(modeName1);
//                    modeData2.setValue(0);
//                    payNumoption.add(modeData2);
//                }
//            }
//            statisticsRes.setPayNumoption(payNumoption);//设置好支付方式统计-笔数
//        }
//
//        else {//没有确定唯一的方式
//            QueryWrapper<Order> wrapper3 = ToolUtil.getWrapper(dept, mode, iCnfInfoServiceIml,type,day,month,true);
//            wrapper3.groupBy("cnfinfo_id");
//            wrapper3.select("cnfinfo_id as cnfinfoId,count(*) as count");
//            List<Map<String, Object>> maps = iOrderServiceIml.listMaps(wrapper3);
//
//
//            //将所有cnfInfoIds中有数据的加入到payNumoption中，并在cnfInfoIds中删除已经加入的
//            for (Map<String, Object> map : maps) {
//                int cnfinfoId1 = (int) map.get("cnfinfoId");
//
//                cnfInfoIds.remove((Integer) cnfinfoId1);//进行删除
//                Integer count = (int) (long) map.get("count");
//                CnfInfo cnfInfo = iCnfInfoServiceIml.getById(cnfinfoId1);
//                String modeName = iModeServiceIml.getById(cnfInfo.getMode()).getName();
//                ModeData modeData = new ModeData();
//                modeData.setValue(count);
//                modeData.setName(modeName);
//                payNumoption.add(modeData);
//            }
//            for (Integer cnfInfoId : cnfInfoIds) {//再对剩余的cnfInfoId进行加入
//                String modeName = iModeServiceIml.getById(iCnfInfoServiceIml.getById(cnfInfoId).getMode()).getName();
//                ModeData modeData = new ModeData();
//                modeData.setValue(0);
//                modeData.setName(modeName);
//                payNumoption.add(modeData);
//            }
//            statisticsRes.setPayNumoption(payNumoption);//设置好支付方式统计-笔数
//        }

        return new Res(true, JSON.toJSONString(statisticsRes), "成功获取所有可视化的数据");
    }


    @ApiOperation("获取部门信息")
    @GetMapping("/dept")
    @Transactional(readOnly = true)
    public Res getResData() {
        List<Dept> list = iDeptServiceIml.list();
        return new Res(true, JSON.toJSONString(list), "成功获取所有部门信息");
    }

}
